
/* $Id: anagrammi.c 7 2009-12-27 16:46:23Z calicant $ */

#include "edilana.h"

static void StringaBaseB (char *s, int tab[])
{
register int i;

	for (i = 0; i < NUMALFA; i++) tab[i] = 0;
	while (*s) tab[*s++-INIZALFA]++;

}

static int SottrazB (int tab[], int tab2[], char *sresto)
{
register int i, j, c, k = 0;
char ch;

	for (i = 0; i < NUMALFA; i++)
		if ((c = tab[i]-tab2[i]) == 0)
			continue;
		else if (c > 0) {
			ch = INIZALFA + i;
			for (j = 0; j < c; j++)
				sresto[k++] = ch;
		}
		else return ON;

	sresto[k] = '\0';

return OFF;
}

/*
 * Costruisce una tabella di nome-firma a partire dai lemmi di "nomefile"
 * e stampa in un file i candidati anagrammi della profondita' specificata
 * da "depth" della stringa la cui firma e' "tab".
 */
static void CercaAnags (int tab[], int depth, char *nomefile)
{
struct 	FirmaNome *wp[MAXWORDS];
char	resto[MAXSTRLEN],
	buf[MAXSTRLEN],
	base[MAXSTRLEN];
int	tab2[NUMALFA], tab3[NUMALFA];
int	nwords = 0;
long	numanags;
FILE	*outlista;
register int i, j, k;


	if ((outlista = IOFile(NOMEANAGS,"w")) == NULL) return;

	nwords = CostruisciTabella(wp,nomefile,nwords,MAXWORDS);

	numanags = 0;

	for (i = 0; i < nwords; i++) {
		SottrazB(tab,wp[i]->tabe,base);
		StringaBaseB(base,tab2);
		for (j = i+1; j < nwords; j++)
			if (!SottrazB(tab2,wp[j]->tabe,base))
					if (depth) {
						StringaBaseB(base,tab3);
						for (k = j+1; k < nwords; k++)
							if (!SottrazB(tab3,wp[k]->tabe,resto)) {
								sprintf(buf, "%s %s %s %s\n",
									wp[i]->nome,
									wp[j]->nome,
									wp[k]->nome,
									resto
								);
								numanags++;
								fputs(buf, outlista);
							}
					}
					else {
						sprintf(buf, "%s %s %s\n",
							wp[i]->nome,
							wp[j]->nome,
							base
						);
						numanags++;

						fputs(buf, outlista);
					}
	} /* end if i */

	fclose(outlista);

	LiberaMemoria(wp,nwords);

	if (numanags > 1)
		printf(" mi sembra di aver trovato %ld candidati anagrammi\n\n",
			numanags);
	else
		IoDico(TROVATO_POCO);
}

extern struct Setup *conf;

int
CalcAnagrammi (
	int  tab[],
	char *sott,
	int  Resto,
	char *srest,
	int  Lungh
)
{
int	i, tab2[NUMALFA];
char	stemp[MAXSTRLEN], c1, c2;
char	file_candi[MAXSTRLEN],
	file_resto[MAXSTRLEN];
static char   nome[MAXSTRLEN] = "";


	strcpy(file_candi, NOMECANDI);
	strcpy(file_resto, NOMERESTO);

	if (sott[1] == '*') {
		if (sott[2] == '\n')
			return COMANDO_ERRATO;
		strcpy(sott,&sott[1]);
		if (strcmp(nome,conf->nomecognome)) {
			if (CercaCandidate(tab,conf->vocabnomi,ALIASCANDI,&i,OFF) < 0)
				return 0;
			strcpy(nome,conf->nomecognome);
		}
		strcpy(file_candi,ALIASCANDI);
		strcpy(file_resto,TEMPFILE);
	}
	c1 = sott[1];
	c2 = sott[2];
	if (c1 == '2' || c1 == '3') {
		if (c1 == '2') i = OFF;
		else i = ON;
		printf(" *** Attendere un po'... ");
		CercaAnags(tab,i,file_candi);
	}
	else if (c1 == '0') {
			if (Resto == OFF) return NON_RESTO;
			Lungh = StringaBase(srest,tab2);
			CercaCandidate(tab2,file_candi,file_resto,&i,OFF);
			CercaAnags(tab2,OFF,file_resto);
	}
	else if (c1 == '1') {
		StampaCol(file_candi,1,tab,Lungh+1,ON,OFF,sott);
		return 0;
	}
	else if (c1 == '\n') ;
	else if (!isalpha(c1)) return COMANDO_ERRATO;

	i = OFF;
	if (isalpha(c1))
		i = !Sottraz(tab,sott,stemp,Lungh,OFF);

	StampaCol(NOMEANAGS,1,tab2,Lungh+3,OFF,i,sott);

return 0;
}

int AutoAnagrammi (char *sott, int Lungh)
{
char nome[MAXSTRLEN];
char stemp[2 * MAXSTRLEN];

int  tab2[NUMALFA];

	sott[0] = ' ';
	Stripnl(sott);
	strcpy(nome, conf->nomecognome);
	Pulisci(nome);

	sprintf(stemp, "%s%s >%s %s",
		conf->anagcmd,
		sott,
		NOMEANAGS,
		nome
	);
	system(stemp);
	StampaCol(NOMEANAGS, 1, tab2, Lungh+3, OFF, OFF, sott);
				
return 0;
}
